home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / os2 / kzr0597.zip / EXP.CMD < prev    next >
OS/2 REXX Batch file  |  1997-03-09  |  3KB  |  97 lines

  1. /* REXX-Funktion exp.CMD */
  2.    "@ echo off"
  3.  
  4.    Call RxFuncAdd 'SysLoadFuncs', RexxUtil, 'SysLoadFuncs'
  5.    Call SysLoadFuncs
  6.    signal on syntax name expMsg
  7.  
  8. /* Diese Variablen müssen für jede Prozedur definiert werden, damit die  */
  9. /* Prozedur die Variable bufND kennt und die Variable ND übernehmen kann.*/
  10.    Pfd=SysSearchPath("PATH", "kzr.cmd")
  11.    lp=LastPos("\", Pfd)
  12.    Pfd=DelStr(Pfd, 1+lp)
  13.    bufND =Pfd||"NDZahl.DAT"
  14.    NDAexp=Pfd||"NDAexp.DAT"
  15.    bufMsg=Pfd||"Meldung.DAT"
  16.    ND = LineIn(bufND, 1)
  17.  
  18.    NUMERIC DIGITS ND+10
  19.  
  20. /* An dieser Stelle muß  "bufMsg"  gelöscht werden, damit dann,   */
  21. /* die Datei  "Meldung.DAT"  leer ist, diese auch leer bleibt.    */
  22.    call charout(bufMsg)
  23.    Call SysFileDelete bufMsg
  24.  
  25.    parse UPPER arg x,y
  26.    p0p=x*x /* Diese Anweisung provoziert eine Syntax-Fehlermeldung */
  27.  
  28.    if length(y) > 0 then
  29.    do
  30.      call charout(NDAexp); Call SysFileDelete NDAexp
  31.      ret=LineOut(bufMsg, "Im Argument von  exp(...)  ist mindestens 1 nicht zulässiges Komma !")
  32.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  33.   /*  damit in den diesbezüglichen temporären Dateien                      */
  34.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  35.      EXIT
  36.    end
  37.  
  38.    if x=0 then do; u=1; signal W; end
  39.  
  40.    if abs(x) >= 1.0E+9 then
  41.    do
  42.      call charout(NDAexp); Call SysFileDelete NDAexp
  43.      ret=LineOut(bufMsg, "     Der absolute Betrag des Argumentes der Funktion exp(...)",
  44.                          "                      ",
  45.                          "darf nicht größer als  1.0E+9  sein.")
  46.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  47.   /*  damit in den diesbezüglichen temporären Dateien                      */
  48.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  49.      EXIT
  50.    end
  51.  
  52.    xg=trunc(x)
  53.    xr=x-xg
  54.    yxg=efunk(1,ND)
  55.    yxr=efunk(xr,ND)
  56.    u=yxr*yxg**xg
  57.  
  58. W: numeric digits ND
  59.    return(Format(u))
  60.  
  61. EXIT
  62.  
  63. efunk:
  64.    Procedure
  65.    arg x, ND
  66.    g=1; n=1; y=1
  67.    do forever
  68.      g=g*x/n
  69.      if abs(g/y) < 10**(-ND-10) then leave
  70.      y=y+g
  71.      n=n+1
  72.    end
  73.    return(y)
  74.  
  75. expMsg:
  76.    sf=ErrorText(RC)
  77.    if  Pos("Arithmetic overflow", sf) > 0 | Pos("Invalid whole", sf) >0 then
  78.    do
  79.      call charout(NDAexp); Call SysFileDelete NDAexp
  80.      ret=LineOut(bufMsg, "Es müssen zu große Zahlenwerte verarbeitet werden !")
  81.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  82.   /*  damit in den diesbezüglichen temporären Dateien                      */
  83.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  84.      EXIT
  85.    end
  86.  
  87.    if  Pos("Bad arithmetic conversion", sf) > 0 then
  88.    do
  89.      call charout(NDAexp); Call SysFileDelete NDAexp
  90.      ret=LineOut(bufMsg, "Sie haben in  exp(...)  kein gültiges Argument eingegeben !")
  91.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  92.   /*  damit in den diesbezüglichen temporären Dateien                      */
  93.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  94.      EXIT
  95.    end
  96.  
  97.